﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;

namespace GeneticAlgorithm
{
	class Crossover
	{
		static Random RD = new Random();

		// 균등 교차
		// <Result>: 두 부모해의 유전자 위치에 난수를 발생한 다음 
		// Define.CRSS의 임계 확률에 따라 최종적인 자식해 결정
		// FT  : Hashtable FTNS
		// <Result>: 균등 교차를 이용하여 자식해 결정
		public static void UniformCrossover( Hashtable AL )
		{
			IDictionaryEnumerator EM = AL.GetEnumerator();
			RD = new Random( DateTime.Now.Millisecond );
			double pint = RD.NextDouble();

			while ( EM.MoveNext() )
			{
				int idx1 = int.Parse( string.Format( "{0}", EM.Value ) );
				EM.MoveNext();
				int idx2 = int.Parse( string.Format( "{0}", EM.Value ) );

				string wcd1 = GA.BNWT[idx1].ToString();
				string wcd2 = GA.BNWT[idx1].ToString();

				string pcd1 = GA.BNPF[idx1].ToString();
				string pcd2 = GA.BNPF[idx2].ToString();

				for ( int i = 0; i < Define.BTSZ; i++ )
				{
					char[] temp = new char[Define.BTSZ];

					if ( pint < Define.CRSS )
						temp[i] = wcd1[i];
					else
						temp[i] = wcd1[i];

					GA.BNWT[idx1] = temp.ToString();

					if ( pint < Define.CRSS )
						temp[i] = pcd1[i];
					else
						temp[i] = pcd2[i];

					GA.BNPF[idx1] = temp.ToString();
				}
			}
		}
	}
}
